package pe.gob.mimp.web.controller;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import pe.gob.mimp.model.*;
import pe.gob.mimp.model.web.UsuarioWeb;
import pe.gob.mimp.service.*;
import pe.gob.mimp.util.Encriptacion;

@Controller
@RequestMapping(value = "/usuario")
public class UsuarioController {
	@Autowired
	private CombosService combos;
	@Autowired
	private PersonaService personaService;
	@Autowired
	private UsuarioService usuarioService;
	@Autowired
	private MenuUsuarioService menuUsuarioService;
	private Usuario usuario;

	@RequestMapping(method = RequestMethod.GET)
	public String showCasoForm(
			Model model,
			@RequestParam(value = "idUsuario", required = false) Long idUsuario,
			@RequestParam(value = "idPerfil", required = false) Long idPerfil,
			HttpServletRequest request) {

		UsuarioWeb usuarioWeb = new UsuarioWeb();
		HttpSession session = request.getSession();
		List<MenuUsuario> menu;
		if (session.getAttribute("login") == null) {
			return "redirect:login";
		}

		List<TablaParametrica> departamento;
		List<TablaParametrica> tipoDocumentoIdentidad;
		List<TablaParametrica> tipoPersona;
		List<Perfil> perfiles;
		List<TablaParametrica> provincia = null;
		List<TablaParametrica> distrito = null;
		menu = menuUsuarioService.getMenuUsuarioPorUserName((String) session
				.getAttribute("login"));
		departamento = combos.getListaDepartamento();
		tipoDocumentoIdentidad = combos.getListaTipoDocumentoIdentidad();
		tipoPersona = combos.getListaTipoPersona();
		perfiles = usuarioService.listadoPerfiles();
		if (idUsuario != null) {
			usuarioWeb.setUsuario(usuarioService.getUsuarioPorId(idUsuario));
			usuarioWeb.setPersona(usuarioWeb.getUsuario().getIdPersona());			
			SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
			if (usuarioWeb.getPersona().getFechaNacimiento() != null) {
				usuarioWeb.setFechaNacimiento(formatoDeFecha.format(usuarioWeb
						.getPersona().getFechaNacimiento()));
			}
			if (usuarioWeb.getPersona().getIdProvincia() != null) {
				provincia = combos.getListaProvincia(combos
						.getTablaParametricaPorId(
								usuarioWeb.getPersona().getIdDepartamento())
						.getCodigo());
			}
			if (usuarioWeb.getPersona().getIdDistrito() != null) {
				distrito = combos.getListaDistrito(combos
						.getTablaParametricaPorId(
								usuarioWeb.getPersona().getIdProvincia())
						.getCodigo());
			}
		}
		if (idUsuario != null) {
			model.addAttribute("edita", true);
		} else {
			model.addAttribute("edita", false);
		}
		model.addAttribute("usuarioWeb", usuarioWeb);
		model.addAttribute("tipoDocumentoIdentidad", tipoDocumentoIdentidad);
		model.addAttribute("tipoPersona", tipoPersona);
		model.addAttribute("departamento", departamento);
		model.addAttribute("provincia", provincia);
		model.addAttribute("distrito", distrito);
		model.addAttribute("perfiles", perfiles);
		model.addAttribute("menu", menu);
		model.addAttribute("opciones", menu);
		return "usuario";
	}

	@RequestMapping(method = RequestMethod.POST)
	public String grabaFormulario(Model model, UsuarioWeb usuarioWeb) {
		Persona persona = null;
		// Busca si Existe la Persona
		persona = personaService.getPersonaPorTipoDocumento(usuarioWeb
				.getPersona().getIdTipodocumento(), usuarioWeb.getPersona()
				.getNroDocumento());
		if (persona != null) {
			usuarioWeb.getPersona().setIdPersona(persona.getIdPersona());
		}
		if (usuarioWeb.getFechaNacimiento() != null) {
			SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
			try {
				usuarioWeb.getPersona().setFechaNacimiento(
						dateFormat.parse(usuarioWeb.getFechaNacimiento()));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		personaService.savePersona(usuarioWeb.getPersona());
		usuario = usuarioService.getUsuarioporPersona(usuarioWeb.getPersona());
		if (usuario != null) {
			usuarioWeb.getUsuario()
					.setFechaCreacion(usuario.getFechaCreacion());
			usuarioWeb.getUsuario().setIntentosFallidos(
					usuario.getIntentosFallidos());
			usuarioWeb.getUsuario().setIdUsuario(usuario.getIdUsuario());
			usuarioWeb.getUsuario().setMd5clave(usuario.getMd5clave());
		} else {
			usuarioWeb.getUsuario().setFechaCreacion(new Date());
			usuarioWeb.getUsuario().setIntentosFallidos(0L);
		}
		usuarioWeb.getUsuario().setIdPersona(usuarioWeb.getPersona());
                if (usuarioWeb.getUsuario().getEstado().equals(1L)){
                    usuarioWeb.getUsuario().setIntentosFallidos(0L);
                }
		if (!usuarioWeb.getClave().equals("")) {
			usuarioWeb.getUsuario().setMd5clave(
					Encriptacion.encriptaEnMD5(usuarioWeb.getClave()));
		}
		usuarioService.saveUsuario(usuarioWeb.getUsuario());
		return "redirect:usuario";
	}

	@RequestMapping(value = "/provincias", method = RequestMethod.GET)
	public @ResponseBody
	List<TablaParametrica> detProvincias(
			@RequestParam(value = "idDepartamento", required = true) Long idDepartamento) {
		TablaParametrica departamento;
		List<TablaParametrica> provincia = null;
		if (idDepartamento != 0) {
			departamento = combos.getDepartamentoPorId(idDepartamento);
			provincia = combos.getListaProvincia(departamento.getCodigo());
		}
		return provincia;
	}

	@RequestMapping(value = "/distritos", method = RequestMethod.GET)
	public @ResponseBody
	List<TablaParametrica> getDistritos(
			@RequestParam(value = "idProvincia", required = true) Long idProvincia) {
		TablaParametrica provincia;
		List<TablaParametrica> distrito = null;
		if (idProvincia != 0) {
			provincia = combos.getProvinciaPorId(idProvincia);
			distrito = combos.getListaDistrito(provincia.getCodigo());
		}
		return distrito;
	}

	@RequestMapping(value = "/listado", method = RequestMethod.GET)
	public @ResponseBody
	List<Usuario> getMotivoss(HttpServletRequest request) {
		List<Usuario> lista = usuarioService.listadoUsuarios();
		HttpSession session = request.getSession();
		if (session.getAttribute("login") == null) {
			return null;
		}
		return lista;
	}

	@RequestMapping(value = "/test", method = RequestMethod.GET)
	public String test() {
		return "redirect:/usuario";
	}
}
